3章 LLMによるテキスト生成の標準的な手法
3.9 誰にでも理解できるようになるプロンプト
複雑な内容でも誰にでも理解できるように説明してくれるようになるプロンプト
5歳児にもわかるように説明してください
3.11 コンテキストの要求
LLMが正確な応答に必要なコンテキストが必要と判断した時に要求するするプロンプト
さらにコンテキストが必要であれば、どのようなコンテキストがよりいい決定を下すのに役立つかを示してください
3.12 テキストスタイルの分解
テキストからトーン(全体の雰囲気)・長さ・語集・構造の特徴を抜き出しやりかた
上記の特徴を抜き出すことで、文書を書く際に共通の特徴をもった生成が期待できる
ブランドの一貫性の向上:一環したイメージの維持
コンテンツ作成の効率化:ガイドラインに則ったコンテンツの作成が簡単になる
適応性:既存のコンテンツから新しいコンテンツを変える時に、スタイルだけ刷新しつつトーンなどは維持できるようになる
3.13 抽出したテキストの特徴の指定
トーン:テキストが感じる全体的な雰囲気
長さ:希望する五数やコンテンツの一般的な長さ
語彙と表現:使用する語彙や表現(専門的な単語・表現・複雑さなど)
サンプル
code:_
次のテキストを分解して、今後の文書が同じスタイル、一貫性、出力形式を模倣できるようにするための主要な特徴を特定してください
今後の文書の使用するスタイルライティングガイドラインとして、すべての特徴を提供してください。
次のテキストを分析してください
3.17 コンテキストウィンドウの上限を考慮した要約
LLMが一回のリクエストの許容量を超える場合は、文書を意味のあるまとまりで分解・要約させ、最後にまとめて要約する手法がある。
3.18 テキストのチャンク化
テキストのチャンク化の利点
LLMの入出力のトークン数制限を管理しやすくなる
トークン使用料やAPIコストを削減できる
LLMの処理不可が軽減されるので、応答時間を短縮できて効率的に処理ができる
チャンク化が必要な場合
LLMトークン制限をこあえる場合
文書が複雑で効率的に処理するためは分割を行う必要がある場合
複数のトピックがあって個別に処理した方がいい場合
チャンク化が不要な場合
文書が小規模でトーク数数制限内に収まる場合
単純な分析の場合
トピックが単一で完結する場合
チャンク化の戦略
文章単位での分割:要約や翻訳、感情分析にタスクに有益
メリット:文脈を維持して、さまざまなタスクに適応
デメリット:長い文章の場合は効率的でない
段落単位の分割:文書分析、トピックモデリング、情報抽出に最適
メリット:長いコンテンツを処理して、まとまりのある単位で処理できる
デメリット:粒度が粗いため、微妙な関連性が見逃す可能性がある
トピック単位での分割:テキスト分類、コンテンツ推薦、クラスタリングに最適
メリット:テーマを特定し分類できる
デメリット:細かい点を見逃す可能性がある
複雑さに基づいた分割:読みやすさの分析、コンテンツの最適化、パーソナライズされた学習タスクに最適
メリット:同じ複雑さをグルーピングできる
デメリット:複雑さの測定が必要。すべてのタスクに最適ではない
長さ単位で分割:大規模なテキスト分析、検索エンジンのインデックス作成、テキスト前処理のアプリケーションに最適
メリット:長いコンテンツで処理できるので、効率的な処理を行える
デメリット:文脈が失われる可能性がある
トークン単位での分割:
メリット:正確にトークン調査できるので、トークン制限のコントロールができる
デメリット:トークン化が必要であるため、計算の複雑さが増す
3.20 文章単位の検出
文の検出(文境界判定)とは自然言語内で最初と最後を検出することを指す
上記で記載した文章単位で分割する時には、文境界判定するライブラリなどを使用することにな(spaCy ※ python)
3.21 チャンク化のアルゴリズムの構築
チャンクする際に文字数単位で分割した場合、文や単語が区切られる場合がある。この場合は、以下の配慮が必要
単語全体を保持する
文や話者が述べた要点も保持する(理想的)
文が複数のページにまたがる場合
チャック化された時のトークン数がコンテキストウィンドウに収まるか
3.22 スライディングウィンドウによるチャンク化
スライディングウィンドウとは、文章を開始位置を変えながら、特定の文字数で分割する方法
重要な要素
ウィンドウサイズ:何文字で分割するかの値
ステップサイズ:開始位置をどれだけずらすか
code:text
原文テキスト:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ ウィンドウサイズ = 10文字, ステップサイズ = 10(overlap = 0)
→ 重複なし。高速だが「けこ」と「さし」の間の文脈が切れる。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ ウィンドウサイズ = 10文字, ステップサイズ = 7(overlap = 3)
→ 3文字分重複。境界の文脈が保持される。
チャンク間の重なりを実現できるため、文境界判定の代替アプローチになる
3.23 テキストのチャンク化のパッケージ
最大コンテキスト長は入力トークン数 + 出力トークン数より少なくする必要がある
3.24 tiktokenを使ったテキストのトークン化
tiktoken はテキストをトークン化するトークナイザーであり、トークン数などをカウントすること際に用いられる
tiktoken はOpenAIで使用する前提で設計されている
トークン数などを把握することは以下のメリットがある
正確なトークン数がわかるので、最大コンテキスト長の考慮ができる
OpenAI APIを使用する際のリソースを最適化することがきる
テキストをトークン化することをエンコーディングといい、トークンをテキストにすることをデコーディングという
テキストをエンコーディング・デコーディングする時には、tiktoken が準備されているエンコーディング名を直接していることもできるが、OpenAPIのモデル名からエンコーディング名を指定できるやり方もできる。
code:_
方法①: get_encoding("cl100k_base") // モデルが複数プロバイダを使用する場合は、こちらを使用される
↓
cl100k_baseトークナイザー → トークン列
方法②: encoding_for_model("gpt-4") // OpenAIを使う場合はこちらが比較的多い
↓
"gpt-4"をルックアップ → cl100k_base が見つかる
↓
cl100k_baseトークナイザー → トークン列(同じ結果)
3.26 感情分析
感情分析とはテキストの中から感情、意見や心情を特定する方法
プロンプトを使って感情分析をするときには以下を気をつける
明確な指示の提供
テキスト中の感情がポジティブ・ネガティブ・ニュートラルみたいなカテゴリで分類するように記載していること。
例の指示
感情のカテゴリ別に例を記載すること
出力形式の定義
出力が形式をしていること
以下は上記を参考にしたプロンプト
code:_
次の例をガイドとして使用してください
ポジティブ:「この電話のデザインが本当に気に入っています」
ネガティブ:「バッテリーの持ちが残念です」
ニュートラル:「製品は気に入りましたが、バッテリーの持ちが短いです」
次の単語のいずれかの身を返してください
- ポジティブ
- ネガティブ
- ニュートラル
次のテキストの感情をポジティブ、ネガティブ、またはニュートラルとして分類してください
感情分析の精度を上げるためには、プロンプトを実行する前にテキストの前処理をいれるといい
特殊文字の削除
絵文字、ハッシュタグ、句読点などは感情分析アルゴリズムの判断を歪める可能性がある
→最近のLLMは絵文字からも感情を読み取れるようになっている
小文字への転換
大文字と小文字の違いで別の単語として認識されてきている
→最近のLLMは大文字や小文字の違いからも感情を読み取れるようになっている
スペルの修正
スペルミスは誤解を引き起こす可能性があるので、事前にチェックする
3.27 Least-to-Most
Least-to-Mostは順次詳細化ともいう
まずは必要な情報を最初のプロンプトで抽出して、次回以降のプロンプトで高度な指示を行う方法
メリット
段階的な探索
複雑な問題を小さいタスクで分解することでより正確な回答ができる。
新しいテーマや多くの問題を扱い際に役にたつ
柔軟性
問題をさまざまな視点で解決することができる
必要に応じて方向転換したり別の方法を探したり、柔軟的な動きができる
回答内容の理解しやすさの向上
小さいステップに分解しているので回答しやすくなる
協調的な学習
期待する出力の調整を繰り返して、より洗練された回答をめざすプロセスを反復できる
デメリット
情報の欠落
以前のトークン量が多いと、コンテキスト長の制限に引っかかる可能性がある
以前のプロンプトの依存
前回のプロンプトの回答に依存するため、最初の応答の品質に依存する
3.28 ロールプロンプティング
特定の役割やキャラクターを設定させて応答を生成させるやり方
メリット
LLMの応答の範囲を狭めることができる
LLMの独自の視点で考えて応答をするように促すと、創造性も高めることができる
デメリット
役割に基づいてバイアスやステレオタイプを含む可能性がある。回答によっては人を不快にさせることもあるかも
長いやりとりだと役割を維持するのが難しい場合もある
使用するタイミング
特定の専門領域を引き出す
フォーマルな回答、カジュアルな回答、ユーモアのある回答などの応答スタイルを調整したい時
創造的な応答を促す
物語作家、小説のキャラクター、歴史上の人物などの役割を割り当てることで、創造的な応答を生成できる
3.29 LLMプロンプト戦術
参照テキストを用いたハルシネーションを回避
ハルシネーションを回避するためには、プロンプトに中に正確で関連性のある情報を埋め込んで、その情報だけで応答するように促す方法がある
code:_
以下の参照テキストを使って質問に回答してください。
参照テキストに答えが含まれていない場合は「情報が見つかりません」と回答してください。
---参照テキスト---
(ここに正確な情報を貼り付ける)
---参照テキスト終わり---
質問: ○○について教えてください。
考える時間の提供
最終的な結論を決める場合、基本的な原理に基づいて解決策を導くように明示的に指示することで、より正確な応答を目指すことができる
code:_
まず、自分でこの関数を実装してください。
自分の実装が完成するまで、同僚の実装を評価しないでください。
要件:
配列から重複を除去し、元の出現順序を保ったまま返す関数を書いてください。
同僚の実装:
def remove_duplicates(arr):
return list(set(arr))
内部の独り言
アプリケーションによっては推論プロセスを見せたくないことがある。その場合、LLMが推論中のレスポンスにはダブルコーテーションなどを入れて回答するようにして、ユーザーに見せない方法がある
code:_
あなたは数学の家庭教師AIです。
回答は2段階で行ってください:
■ STEP 1(非公開):
"""
ここで問題を分析し、解法を検討してください。
生徒のレベルに合った説明方法を考えてください。
"""
■ STEP 2(公開):
生徒に見せる、わかりやすい説明を書いてください。
"""は含めないでください。
LLMの応答の自己評価
生成されたLLMの応答に対して、重要な情報を見落としていないかを再度確認する方法
応答に対するレビューは改良できなくなるまで何回でも繰り返すことができる
3.30 LLMによる分類
LLMを使ってプロンプトに記載したテキストがどの分類・カテゴリーに所属になるのかを振り分ける方法がある
二つの戦略がある
ゼロショット学習:全く例を提示せずに、分類する方法。現在のモデルは学習データ・推論が強力なので、ある程度の分類が可能
フューショット学習:少数の例を提示して分類する手法。出力形式の構造に影響を与え、分類制度を向上できる
使用例
カスタマーレビューを肯定的、否定的、中立などに分類する
メールの意図や目的から、問い合わせ、苦情、フィードバックなのかを分類する
SNSのテキストから感情を分類する方法
分類するリクエストを複数回送信して、分類結果を多数決で決める方法がある。この手法はより一回で分類されるより、精度の高い分類ができる。しかし、リクエスト量が多くなるのでコスト・トークンとの相談になる。
3.31 評価基準
LLMの応答をLLMが評価する方法もある
複雑な評価をする場合は、問題点を含むテストケースと問題点が含まないテストケースを準備して、偽陽性(問題点が含まれていないテストケースを用意することで、LLMが問題とみなす)と偽陰性(問題点があるに関わらず、LLMが問題を見逃す)の数を数えることで、評価者を評価することができる
複数回評価するとコストやレート制限の問題も発生する。まずは、LLMに依存にしない検証からしていくげき
3.38 メタプロンティング
メタプロンティングとは、LLMに応答するためのプロンプトをLLMの作らせるやりかた
以下の使い方できる
画像生成モデルのためのプロンプトなども対応できる
企業スタイルを打ち出す記事を作成するときには、記事作成する単一のプロンプトを作成するのではなく、最初に企業スタイルや特徴をまとめた規約をまとめたプロンプトを準備しておいた方がスタイルが出しやすいプロンプトになる
目標を達成するためのプロンプトをLLMと壁打ちしながら、洗練しながら最適化をしていく
LLMに作成させたプロンプトを、ベストプラクティス記事などをコンテキストに含めてレビューさせることもができる